Introduction

Package] Template Website Website Website

This report describes the results of the first priming mindfulness study, as well as of the two online pilot studies from the Varela project.

Packages & Data

Packages

library(rempsyc)
library(dplyr)
library(interactions)
library(performance)
library(see)
library(patchwork)
library(ggplot2)
library(rstatix)
library(forecast)
library(DescTools)
library(report)
source("D:/UQAM/Groupe Étudiant @Projet Remi - Documents/Etude 1 -- priming-agression/Analyses - Priming 1/Scripts R/mad functions.R")

summary(report::report(sessionInfo()))

The analysis was done using the R Statistical language (v4.1.2; R Core Team, 2021) on Windows 10 x64, using the packages rstatix (v0.7.0), DescTools (v0.99.44), effectsize (v0.6.0.7), ggplot2 (v3.3.5), stringr (v1.4.0), forcats (v0.5.1), tidyr (v1.2.0), readr (v2.1.2), dplyr (v1.0.8), forecast (v8.16), rmarkdown (v2.13), tibble (v3.1.6), purrr (v0.3.4), interactions (v1.1.5), parameters (v0.17.0.5), insight (v0.17.0), performance (v0.9.0), see (v0.7.0), easystats (v0.4.3), correlation (v0.8.0), modelbased (v0.8.0), bayestestR (v0.11.5.2), report (v0.5.1), datawizard (v0.4.0), rempsyc (v0.0.2.9), patchwork (v1.1.1) and tidyverse (v1.3.1).

Data

df <- read.csv("data/data.csv")
data <- read.csv("data/fulldataset.csv")

cat(paste("The data consists of",
          report::report_participants(data),
          ". There are no demographics available."))

The data consists of 245 participants () . There are no demographics available.

# Dummy-code group variable
data <- data %>% 
  mutate(condition_dum = ifelse(condition == "Mindfulness", 1, 0),
         condition = as.factor(condition))

# Allocation ratio
cat(paste("The allocation ratio is: ",
          report::report(data$condition)))

The allocation ratio is: x: 2 levels, namely Control (n = 128, 52.24%) and Mindfulness (n = 117, 47.76%)

Data Preparation

In this stage, we define a list of our relevant variables and standardize them according to the Median Absolute Deviation (MAD), which is more robust to extreme observations than standardization around the mean.

Basic

# Make list of DVs
col.list <- c("blastintensity", "blastduration", "blastintensity.duration",
              "blastintensity.first", "blastduration.first", "KIMS", 
              "BSCS", "BAQ", "SOPT", "IAT")

# Create new variable blastintensity.duration
data$blastintensity.duration <- (data$blastintensity * data$blastduration)
# Divide by 2? Do some other sort of transformation given I multiplied two scores?
# Should I multiply them after standardization or before?

# Standardize and center main continuous IV variable (based on MAD)
data <- data %>%
  mutate(across(all_of(col.list),
                ~scale_mad(.x),
                .names = "{col}.mad"))

# Rename col.list with the MAD extension
col.list <- paste0(col.list, ".mad")

Blast Intensity * Duration

Why combine the intensity and duration scores? Should we? For a discussion, see:

Elson, M., Mohseni, M. R., Breuer, J., Scharkow, M., & Quandt, T. (2014). Press CRTT to measure aggressive behavior: the unstandardized use of the competitive reaction time task in aggression research. Psychological assessment, 26(2), 419. https://doi.org/10.1037/a0035569

  • Bushman and Baumeister (1998) used the sum of volume and duration settings in the first of 25 trials [p. 3]
  • Lindsay and Anderson (2000) multiplied volume with log-transformed duration settings. The average over 25 trials of those products was their measure for overall aggression.
  • Carnagey and Anderson (2005) averaged the products of volume and the square root of duration to form a single “aggressive energy score” (p. 887). No reason is given for this other than the claim that this single score supposedly is a valid measure and that duration should be square rooted.
  • Bartholow, Sestir, and Davis (2005) multiplied the average volume and duration settings to form a composite aggressive behavior score. Although Bartholow, Bushman, and Sestir (2006) also used volume and duration settings, they standardized and summed the two parameters instead of multiplying them.
  • Sometimes the option of setting the volume and/or duration to zero as a way to act nonaggressively is provided. Including settings of zero as an option also raises further questions, for example, how to handle trials in which participants set only one of the two intensity parameters to zero. [Note: we do have zero as option]
  • With regard to the analysis, there is no definitive answer to the question of how to calculate aggression scores, or whether different scores might measure different types of aggression, as long as none of them have been properly validated. As it seems that volume and duration do not measure the exact same construct, it is advisable to consider them as separate measures for related subdimensions of aggression.

First sound blast

Why use the first sound blast only instead of the average of all trials? Should we?

According to some, the Taylor Aggression Paradigm is not a measure of aggression per say, but of reactive aggression, because participants react to the other “participant’s” aggression. They suggest that for a pure measure of aggression, it is recommended to use only the first sound blast used by the participant before he receives one himself. At this stage, we attempt the analyses with all these different measures of aggression for exploratory purposes. See earlier reference to Elson et al. (2014):

  • If researchers are interested in measuring unprovoked aggression, they should also look at the settings in the first trial. Those studying provoked aggression or retaliation, on the other hand, should focus on all trials except the first one.

t-tests

In this section, we will: (a) test assumptions of normality, (b) transform variables violating assumptions, (c) test assumptions of homoscedasticity, (d) identify and winsorize outliers, and (e) conduct the t-tests.

Normality

# Group normality
sapply(col.list, function(x) 
  nice_normality(data, 
                 x, 
                 "condition",
                 shapiro = TRUE,
                 title = x),
  USE.NAMES = TRUE,
  simplify = FALSE)
> $blastintensity.mad

> 
> $blastduration.mad

> 
> $blastintensity.duration.mad

> 
> $blastintensity.first.mad

> 
> $blastduration.first.mad

> 
> $KIMS.mad

> 
> $BSCS.mad

> 
> $BAQ.mad

> 
> $SOPT.mad

> 
> $IAT.mad

Everything looks good except for the SOPT variable, which is clearly left skewed. We will have no choice but to apply a transformation.

Transformation

Normally, the SOPT raw scores represent the number of errors, but I had multiplied it by -1 initially so that a smaller score would mean lower working memory capacity. Here we reverse it again to be able to use the various transformations.

We also add a constant of 1 to avoid scores of zero which can interfere with the transformation. We will use the Box-Cox transformation to be able to specify an optimal transformation ratio.

# Reverse
#data$SOPT.r <- data$SOPT*-1
# data$SOPT.r <- data$SOPT.mad*-1

# Add constant
# data$SOPT.r <- data$SOPT.r + 1
data$SOPT.r <- data$SOPT.mad + 7

# Box–Cox transformation
#data$SOPT.cox = BoxCox(data$SOPT.r, lambda = 0.25)
# data$SOPT.mad.cox = BoxCox(data$SOPT.r, lambda = 0.25)
# We use an optimal lambda of 0.25 based on trial and error to make both groups look as normal as possible.

data$SOPT.mad.cox = BoxCox(data$SOPT.r, lambda = 3.5)

# Check normality again
nice_normality(data, 
               "SOPT.mad.cox", 
               "condition",
               shapiro = TRUE)

# Update col.list
col.list[charmatch("SOPT", col.list)] <- 
  paste0(col.list[charmatch("SOPT", col.list)], ".cox")

The normality problem is now solved for our SOPT variable. We can now resume with the next step: checking variance.

Homoscedasticity

# Plotting variance
plots(lapply(col.list, function(x) {
  nice_varplot(data, x, group = "condition")
  }),
  n_columns = 3)

Variance looks good. No group has four times the variance of any other group. We can now resume with checking outliers.

Outliers

# Using boxplots
plots(lapply(col.list, function(x) {
  ggplot(data, aes(condition, !!sym(x))) + 
  geom_boxplot()
  }),
  n_columns = 3)

There are some outliers, but nothing unreasonable. Let’s still check with the 3 median absolute deviations (MAD) method.

find_mad(data, col.list, "manualworkerId", criteria = 3)
> 11 outliers based on 3 median absolute deviations.
> $blastintensity.mad
> [1] Row                manualworkerId     blastintensity.mad
> <0 rows> (or 0-length row.names)
> 
> $blastduration.mad
> [1] Row               manualworkerId    blastduration.mad
> <0 rows> (or 0-length row.names)
> 
> $blastintensity.duration.mad
>   Row manualworkerId blastintensity.duration.mad
> 1  45 A1PHDT66U6IK4Q                         3.2
> 2  47 A1QRX4YCTC5ADW                         3.7
> 3  73 A27ATGMMHBO50Z                         3.3
> 4 144 A37Z5PZ4B7VO49                         3.7
> 5 154 A3CLVX6GRHIY29                         3.7
> 6 200  A5B73N9C2HVEG                         3.7
> 7 223  AK4PVAUX4PWT1                         3.5
> 8 239  AW5O1RK3W60FC                         3.6
> 9 242  AXBBXKSC9VFSW                         3.7
> 
> $blastintensity.first.mad
> [1] Row                      manualworkerId           blastintensity.first.mad
> <0 rows> (or 0-length row.names)
> 
> $blastduration.first.mad
> [1] Row                     manualworkerId          blastduration.first.mad
> <0 rows> (or 0-length row.names)
> 
> $KIMS.mad
> [1] Row            manualworkerId KIMS.mad      
> <0 rows> (or 0-length row.names)
> 
> $BSCS.mad
> [1] Row            manualworkerId BSCS.mad      
> <0 rows> (or 0-length row.names)
> 
> $BAQ.mad
>   Row manualworkerId BAQ.mad
> 1  20 A19WXHQSBB6P6O     3.1
> 2 242  AXBBXKSC9VFSW     3.4
> 
> $SOPT.mad.cox
> [1] Row            manualworkerId SOPT.mad.cox  
> <0 rows> (or 0-length row.names)
> 
> $IAT.mad
>   Row manualworkerId IAT.mad
> 1  54 A1VBKV0KJ1FOUC       3
# 17 people using the MAD method
# 37 on MAD standardized data

Winsorization

Visual assessment and the MAD method confirm we have some outlier values. We could ignore them but because they could have disproportionate influence on the models, one recommendation is to winsorize them by bringing the values at 3 SD. Instead of using the standard deviation around the mean, however, we use the absolute deviation around the median, as it is more robust to extreme observations. For a discussion, see:

Leys, C., Klein, O., Bernard, P., & Licata, L. (2013). Detecting outliers: Do not use standard deviation around the mean, use absolute deviation around the median. Journal of Experimental Social Psychology, 49(4), 764–766. https://doi.org/10.1016/j.jesp.2013.03.013

# Winsorize variables of interest with MAD
data <- data %>% 
  mutate(across(all_of(col.list), 
                winsorize_mad,
                .names = "{.col}.w"))

# Update col.list
col.list <- paste0(col.list, ".w")

Outliers are still present but were brought back within reasonable limits, where applicable. We are now ready to compare the group condition (Control vs. Mindfulness Priming) across our different variables with the t-tests.

t-tests

nice_t_test(data, 
            response = col.list, 
            group = "condition") %>% 
  nice_table(highlight = 0.10)
> Using Welch t-test (base R's default; cf. https://doi.org/10.5334/irsp.82). 
> For the Student t-test, use `var.equal = TRUE`. 
>  
> 

Interpretation: There is no clear group effect from our experimental condition on our different variables. However, there is a marginal effect of condition on blast intensity, whereas the mindfulness group has slightly higher blast intensity than the control group. Let’s visualize this effect.

Violin plots

Blast Intensity

nice_violin(data, 
            group = "condition", 
            response = "blastintensity.mad.w",
            comp1 = 1,
            comp2 = 2,
            obs = TRUE)

Blast Duration

nice_violin(data, 
            group = "condition", 
            response = "blastduration.mad.w",
            comp1 = 1,
            comp2 = 2,
            obs = TRUE)

Blast Intensity * Duration

nice_violin(data, 
            group = "condition", 
            response = "blastintensity.duration.mad.w",
            comp1 = 1,
            comp2 = 2,
            obs = TRUE)

Means, SD

Let’s extract the means and standard deviations for journal reporting.

Blast Intensity

data %>% 
    group_by(condition) %>% 
    summarize(M = mean(blastintensity),
              SD = sd(blastintensity),
              N = n()) %>% 
  nice_table(width = 0.40)

Blast Duration

data %>% 
    group_by(condition) %>% 
    summarize(M = mean(blastduration),
              SD = sd(blastduration),
              N = n()) %>% 
  nice_table(width = 0.40)

Blast Intensity * Duration

data %>% 
    group_by(condition) %>% 
    summarize(M = mean(blastintensity.duration),
              SD = sd(blastintensity.duration),
              N = n()) %>% 
  nice_table(width = 0.40)

Moderations

Let’s see if our variables don’t interact together with our experimental condition. But first, let’s test the models assumptions.

Assumptions

Blast Intensity

big.mod1 <- lm(blastintensity.mad.w ~ condition_dum*KIMS.mad.w + 
                 condition_dum*BSCS.mad.w + condition_dum*BAQ.mad.w + 
                 condition_dum*SOPT.mad.cox.w + condition_dum*IAT.mad.w, 
               data = data, na.action="na.exclude")
check_model(big.mod1)

The model assumptions look really good actually, even with all these variables [less true now with the standardization and winsorization!]. Let’s look at the results.

Blast Duration

big.mod2 <- lm(blastduration.mad.w ~ condition_dum*KIMS.mad.w + 
                 condition_dum*BSCS.mad.w + condition_dum*BAQ.mad.w + 
                 condition_dum*SOPT.mad.cox.w + condition_dum*IAT.mad.w, 
               data = data, na.action="na.exclude")
check_model(big.mod2)

The model assumptions look really good actually, even with all these variables [less true now with the standardization and winsorization!]. Let’s look at the results.

Blast Intensity * Duration

big.mod3 <- lm(blastintensity.duration.mad.w ~ condition_dum*KIMS.mad.w + 
                 condition_dum*BSCS.mad.w + condition_dum*BAQ.mad.w + 
                 condition_dum*SOPT.mad.cox.w + condition_dum*IAT.mad.w, 
               data = data, na.action="na.exclude")
check_model(big.mod3)

The model assumptions look really good actually, even with all these variables [less true now with the standardization and winsorization!]. Let’s look at the results.

Moderations

Blast Intensity

big.mod1 %>% 
  nice_lm() %>% 
  nice_table(highlight = TRUE)

Interpretation: There is one significant interaction: condition by trait self-control (brief self-control scale, BSCS). However, there are marginally significant interactions, with BAQ and IAT (as expected), but not with SOPT.

Interpretation: Again, there seems to be an interaction between condition and self-control. However, there are also effects of the IAT, of SOPT, and of condition. [Note: it seems that after standardizing and winsorizing, the effects of condition and IAT go from significant to marginally significant only.]

Blast Duration

big.mod2 %>% 
  nice_lm() %>% 
  nice_table(highlight = TRUE)

Blast Intensity * Duration

big.mod3 %>% 
  nice_lm() %>% 
  nice_table(highlight = TRUE)

Interaction plots

Let’s plot the main significant interaction(s).

Blast Intensity

# Plot
interact_plot(big.mod1, pred = "condition_dum", modx = "BSCS.mad.w", 
              modxvals = NULL, interval = TRUE)

Interpretation: For people with low self-control, the priming mindfulness condition (cond = 1) seems to have little effect on blast intensity relative to the control condition (cond = 0). In contrast, for people with high self-control, the priming mindfulness condition relates to higher blast intensity.

Blast Duration

# Plot
interact_plot(big.mod2, pred = "condition_dum", modx = "BSCS.mad.w", 
              modxvals = NULL, interval = TRUE)

Interpretation: For people with low self-control, the priming mindfulness condition (cond = 1) seems to have little effect on blast intensity relative to the control condition (cond = 0). In contrast, for people with high self-control, the priming mindfulness condition relates to higher blast intensity.

Blast Intensity * Duration

# Plot
interact_plot(big.mod1, pred = "condition_dum", modx = "BSCS.mad.w", 
              modxvals = NULL, interval = TRUE)

Interpretation: For people with low self-control, the priming mindfulness condition (cond = 1) seems to have little effect on blast intensity relative to the control condition (cond = 0). In contrast, for people with high self-control, the priming mindfulness condition relates to higher blast intensity.

Simple slopes

Blast Intensity

Let’s look at the simple slopes now (only for the significant interaction).

big.mod1 %>%
  nice_lm_slopes(predictor = "condition_dum",
                 moderator = "BSCS.mad.w") %>% 
  nice_table(highlight = TRUE)

Interpretation: The effect of priming mindfulness on blast intensity is only significant for people with a high self-control.

Blast Duration

Blast Intensity * Duration

Conclusions

Based on the absence of effect for blast duration or the interaction between blast intensity and blast duration, I would suggest modifying the Taylor task to remove the blast duration prompt as to only keep blast intensity. It is one of the specifiable option in the task parameters so it is an easy change. I believe doing so will provide a cleaner and more straightforward task for participants.

Full Code

The full script of executive code contained in this document is reproduced here.

# Set up the environment (or use local alternative `source("utils/config.R")`)
source("utils/config.R")

fast <- FALSE  # Make this false to skip the chunks
# This chunk is a bit complex so don't worry about it: it's made to add badges to the HTML versions
# NOTE: You have to replace the links accordingly to have working "buttons" on the HTML versions
if (!knitr::is_latex_output() && knitr::is_html_output()) {
  cat("[![Package](https://www.repostatus.org/badges/latest/active.svg)](https://github.com/rempsyc/rempsyc/actions)]
      [![Template Website](https://img.shields.io/badge/visit-website-E91E63)](https://realitybending.github.io/TemplateResults/)
      [![Website](https://img.shields.io/badge/download-.docx-FF5722)](https://github.com/RealityBending/TemplateResults/raw/main/word_and_pdf/SupplementaryMaterials.docx)
      [![Website](https://img.shields.io/badge/see-.pdf-FF9800)](https://github.com/RealityBending/TemplateResults/blob/main/word_and_pdf/SupplementaryMaterials.pdf)")
}
library(rempsyc)
library(dplyr)
library(interactions)
library(performance)
library(see)
library(patchwork)
library(ggplot2)
library(rstatix)
library(forecast)
library(DescTools)
library(report)
source("D:/UQAM/Groupe Étudiant @Projet Remi - Documents/Etude 1 -- priming-agression/Analyses - Priming 1/Scripts R/mad functions.R")

summary(report::report(sessionInfo()))
df <- read.csv("data/data.csv")
data <- read.csv("data/fulldataset.csv")

cat(paste("The data consists of",
          report::report_participants(data),
          ". There are no demographics available."))

# Dummy-code group variable
data <- data %>% 
  mutate(condition_dum = ifelse(condition == "Mindfulness", 1, 0),
         condition = as.factor(condition))

# Allocation ratio
cat(paste("The allocation ratio is: ",
          report::report(data$condition)))

# Make list of DVs
col.list <- c("blastintensity", "blastduration", "blastintensity.duration",
              "blastintensity.first", "blastduration.first", "KIMS", 
              "BSCS", "BAQ", "SOPT", "IAT")

# Create new variable blastintensity.duration
data$blastintensity.duration <- (data$blastintensity * data$blastduration)
# Divide by 2? Do some other sort of transformation given I multiplied two scores?
# Should I multiply them after standardization or before?

# Standardize and center main continuous IV variable (based on MAD)
data <- data %>%
  mutate(across(all_of(col.list),
                ~scale_mad(.x),
                .names = "{col}.mad"))

# Rename col.list with the MAD extension
col.list <- paste0(col.list, ".mad")

report::cite_packages(sessionInfo())

# Group normality
sapply(col.list, function(x) 
  nice_normality(data, 
                 x, 
                 "condition",
                 shapiro = TRUE,
                 title = x),
  USE.NAMES = TRUE,
  simplify = FALSE)
# Reverse
#data$SOPT.r <- data$SOPT*-1
# data$SOPT.r <- data$SOPT.mad*-1

# Add constant
# data$SOPT.r <- data$SOPT.r + 1
data$SOPT.r <- data$SOPT.mad + 7

# Box–Cox transformation
#data$SOPT.cox = BoxCox(data$SOPT.r, lambda = 0.25)
# data$SOPT.mad.cox = BoxCox(data$SOPT.r, lambda = 0.25)
# We use an optimal lambda of 0.25 based on trial and error to make both groups look as normal as possible.

data$SOPT.mad.cox = BoxCox(data$SOPT.r, lambda = 3.5)

# Check normality again
nice_normality(data, 
               "SOPT.mad.cox", 
               "condition",
               shapiro = TRUE)

# Update col.list
col.list[charmatch("SOPT", col.list)] <- 
  paste0(col.list[charmatch("SOPT", col.list)], ".cox")

# Plotting variance
plots(lapply(col.list, function(x) {
  nice_varplot(data, x, group = "condition")
  }),
  n_columns = 3)


# Using boxplots
plots(lapply(col.list, function(x) {
  ggplot(data, aes(condition, !!sym(x))) + 
  geom_boxplot()
  }),
  n_columns = 3)


find_mad(data, col.list, "manualworkerId", criteria = 3)
# 17 people using the MAD method
# 37 on MAD standardized data


# Winsorize variables of interest with MAD
data <- data %>% 
  mutate(across(all_of(col.list), 
                winsorize_mad,
                .names = "{.col}.w"))

# Update col.list
col.list <- paste0(col.list, ".w")


nice_t_test(data, 
            response = col.list, 
            group = "condition") %>% 
  nice_table(highlight = 0.10)

nice_violin(data, 
            group = "condition", 
            response = "blastintensity.mad.w",
            comp1 = 1,
            comp2 = 2,
            obs = TRUE)
nice_violin(data, 
            group = "condition", 
            response = "blastduration.mad.w",
            comp1 = 1,
            comp2 = 2,
            obs = TRUE)
nice_violin(data, 
            group = "condition", 
            response = "blastintensity.duration.mad.w",
            comp1 = 1,
            comp2 = 2,
            obs = TRUE)
data %>% 
    group_by(condition) %>% 
    summarize(M = mean(blastintensity),
              SD = sd(blastintensity),
              N = n()) %>% 
  nice_table(width = 0.40)

data %>% 
    group_by(condition) %>% 
    summarize(M = mean(blastduration),
              SD = sd(blastduration),
              N = n()) %>% 
  nice_table(width = 0.40)
data %>% 
    group_by(condition) %>% 
    summarize(M = mean(blastintensity.duration),
              SD = sd(blastintensity.duration),
              N = n()) %>% 
  nice_table(width = 0.40)

big.mod1 <- lm(blastintensity.mad.w ~ condition_dum*KIMS.mad.w + 
                 condition_dum*BSCS.mad.w + condition_dum*BAQ.mad.w + 
                 condition_dum*SOPT.mad.cox.w + condition_dum*IAT.mad.w, 
               data = data, na.action="na.exclude")
check_model(big.mod1)


big.mod2 <- lm(blastduration.mad.w ~ condition_dum*KIMS.mad.w + 
                 condition_dum*BSCS.mad.w + condition_dum*BAQ.mad.w + 
                 condition_dum*SOPT.mad.cox.w + condition_dum*IAT.mad.w, 
               data = data, na.action="na.exclude")
check_model(big.mod2)


big.mod3 <- lm(blastintensity.duration.mad.w ~ condition_dum*KIMS.mad.w + 
                 condition_dum*BSCS.mad.w + condition_dum*BAQ.mad.w + 
                 condition_dum*SOPT.mad.cox.w + condition_dum*IAT.mad.w, 
               data = data, na.action="na.exclude")
check_model(big.mod3)

big.mod1 %>% 
  nice_lm() %>% 
  nice_table(highlight = TRUE)

big.mod2 %>% 
  nice_lm() %>% 
  nice_table(highlight = TRUE)

big.mod3 %>% 
  nice_lm() %>% 
  nice_table(highlight = TRUE)

# Plot
interact_plot(big.mod1, pred = "condition_dum", modx = "BSCS.mad.w", 
              modxvals = NULL, interval = TRUE)

# Plot
interact_plot(big.mod2, pred = "condition_dum", modx = "BSCS.mad.w", 
              modxvals = NULL, interval = TRUE)

# Plot
interact_plot(big.mod1, pred = "condition_dum", modx = "BSCS.mad.w", 
              modxvals = NULL, interval = TRUE)


big.mod1 %>%
  nice_lm_slopes(predictor = "condition_dum",
                 moderator = "BSCS.mad.w") %>% 
  nice_table(highlight = TRUE)

Package References

report::cite_packages(sessionInfo())
  • Alboukadel Kassambara (2021). rstatix: Pipe-Friendly Framework for Basic Statistical Tests. R package version 0.7.0. https://CRAN.R-project.org/package=rstatix
  • Andri Signorell et mult. al. (2021). DescTools: Tools for descriptive statistics. R package version 0.99.44.
  • Ben-Shachar M, Lüdecke D, Makowski D (2020). effectsize: Estimation of Effect Size Indices and Standardized Parameters. Journal of Open Source Software, 5(56), 2815. doi: 10.21105/joss.02815
  • H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.
  • Hadley Wickham (2019). stringr: Simple, Consistent Wrappers for Common String Operations. R package version 1.4.0. https://CRAN.R-project.org/package=stringr
  • Hadley Wickham (2021). forcats: Tools for Working with Categorical Variables (Factors). R package version 0.5.1. https://CRAN.R-project.org/package=forcats
  • Hadley Wickham and Maximilian Girlich (2022). tidyr: Tidy Messy Data. R package version 1.2.0. https://CRAN.R-project.org/package=tidyr
  • Hadley Wickham, Jim Hester and Jennifer Bryan (2022). readr: Read Rectangular Text Data. R package version 2.1.2. https://CRAN.R-project.org/package=readr
  • Hadley Wickham, Romain François, Lionel Henry and Kirill Müller (2022). dplyr: A Grammar of Data Manipulation. R package version 1.0.8. https://CRAN.R-project.org/package=dplyr
  • Hyndman R, Athanasopoulos G, Bergmeir C, Caceres G, Chhay L, O’Hara-Wild M, Petropoulos F,Razbash S, Wang E, Yasmeen F (2022). forecast: Forecasting functions for time series andlinear models. R package version 8.16, <URL: https://pkg.robjhyndman.com/forecast/>.
  • JJ Allaire and Yihui Xie and Jonathan McPherson and Javier Luraschi and Kevin Ushey and Aron Atkins and Hadley Wickham and Joe Cheng and Winston Chang and Richard Iannone (2022). rmarkdown: Dynamic Documents for R. R package version 2.13. URL https://rmarkdown.rstudio.com.
  • Kirill Müller and Hadley Wickham (2021). tibble: Simple Data Frames. R package version 3.1.6. https://CRAN.R-project.org/package=tibble
  • Lionel Henry and Hadley Wickham (2020). purrr: Functional Programming Tools. R package version 0.3.4. https://CRAN.R-project.org/package=purrr
  • Long JA (2019). interactions: Comprehensive, User-Friendly Toolkit for Probing Interactions.R package version 1.1.0, <URL: https://cran.r-project.org/package=interactions>.
  • Lüdecke D, Ben-Shachar M, Patil I, Makowski D (2020). “Extracting, Computing and Exploring theParameters of Statistical Models using R.” Journal of Open Source Software, 5(53), 2445.doi: 10.21105/joss.02445 (URL: https://doi.org/10.21105/joss.02445).
  • Lüdecke D, Waggoner P, Makowski D (2019). “insight: A Unified Interface to Access Informationfrom Model Objects in R.” Journal of Open Source Software, 4(38), 1412. doi:10.21105/joss.01412 (URL: https://doi.org/10.21105/joss.01412).
  • Lüdecke et al., (2021). performance: An R Package for Assessment, Comparison and Testing of Statistical Models. Journal of Open Source Software, 6(60), 3139. https://doi.org/10.21105/joss.03139
  • Lüdecke et al., (2021). see: An R Package for Visualizing Statistical Models. Journal of Open Source Software, 6(64), 3393. https://doi.org/10.21105/joss.03393
  • Makowski, D., Ben-Shachar, M. S. & Lüdecke, D. (2020). The {easystats} collection of R packages. GitHub.
  • Makowski, D., Ben-Shachar, M. S., Patil, I., & Lüdecke, D. (2019). Methods and Algorithms for Correlation Analysis in R. Journal of Open Source Software, 5(51), 2306. doi:10.21105/joss.02306
  • Makowski, D., Ben-Shachar, M. S., Patil, I., & Lüdecke, D. (2020). Estimation of Model-Based Predictions, Contrasts and Means. CRAN.
  • Makowski, D., Ben-Shachar, M., & Lüdecke, D. (2019). bayestestR: Describing Effects and their Uncertainty, Existence and Significance within the Bayesian Framework. Journal of Open Source Software, 4(40), 1541. doi:10.21105/joss.01541
  • Makowski, D., Ben-Shachar, M.S., Patil, I. & Lüdecke, D. (2020). Automated Results Reporting as a Practical Tool to Improve Reproducibility and Methodological Best Practices Adoption. CRAN. Available from https://github.com/easystats/report. doi: .
  • Makowski, Lüdecke, Patil, Ben-Shachar, & Wiernik (2021). datawizard: Easy Data Wrangling. CRAN. Available from https://easystats.github.io/datawizard/
  • R Core Team (2021). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
  • Rémi Thériault (2022). rempsyc: Convenience functions for psychology. R package version 0.0.2.9. https://github.com/rempsyc/rempsyc
  • Thomas Lin Pedersen (2020). patchwork: The Composer of Plots. R package version 1.1.1. https://CRAN.R-project.org/package=patchwork
  • Wickham et al., (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686, https://doi.org/10.21105/joss.01686

References

LS0tDQp0aXRsZTogJyoqUHJpbWluZyBNaW5kZnVsbmVzcyBQcm9qZWN0KionDQpzdWJ0aXRsZTogQ29tcGFyaXNvbiByZXBvcnQNCmF1dGhvcjogIlLDqW1pIFRow6lyaWF1bHQiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cgIyBvcjogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHJlZmVyZW5jZV9kb2N4OiB1dGlscy9UZW1wbGF0ZV9Xb3JkLmRvY3gNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdG9jOiBubw0KICAgIHRvY19kZXB0aDogMw0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHJtYXJrZG93bjo6aHRtbF92aWduZXR0ZToNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICcyJw0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KZWRpdG9yX29wdGlvbnM6DQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQpiaWJsaW9ncmFwaHk6IHV0aWxzL2JpYmxpb2dyYXBoeS5iaWINCmNzbDogdXRpbHMvYXBhLmNzbA0KLS0tDQoNCg0KPCEtLSANCiMgc2V0d2QoIkQ6L09uZURyaXZlIC0gVVFBTS9VUUFNL0RhbmRlbmVhdS9Qcm9qZXRzL1ByaW1pbmcvVGVtcGxhdGVSZXN1bHRzLW1haW4iKQ0KDQohISEhIElNUE9SVEFOVDogcnVuIGBzb3VyY2UoInV0aWxzL3JlbmRlci5SIilgIHRvIHB1Ymxpc2ggaW5zdGVhZCBvZiBjbGlja2luZyBvbiAnS25pdCcNCi0tPg0KDQpgYGB7ciBzZXR1cCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KIyBTZXQgdXAgdGhlIGVudmlyb25tZW50IChvciB1c2UgbG9jYWwgYWx0ZXJuYXRpdmUgYHNvdXJjZSgidXRpbHMvY29uZmlnLlIiKWApDQpzb3VyY2UoInV0aWxzL2NvbmZpZy5SIikNCg0KZmFzdCA8LSBGQUxTRSAgIyBNYWtlIHRoaXMgZmFsc2UgdG8gc2tpcCB0aGUgY2h1bmtzDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KYGBge3IgYmFkZ2VzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KIyBUaGlzIGNodW5rIGlzIGEgYml0IGNvbXBsZXggc28gZG9uJ3Qgd29ycnkgYWJvdXQgaXQ6IGl0J3MgbWFkZSB0byBhZGQgYmFkZ2VzIHRvIHRoZSBIVE1MIHZlcnNpb25zDQojIE5PVEU6IFlvdSBoYXZlIHRvIHJlcGxhY2UgdGhlIGxpbmtzIGFjY29yZGluZ2x5IHRvIGhhdmUgd29ya2luZyAiYnV0dG9ucyIgb24gdGhlIEhUTUwgdmVyc2lvbnMNCmlmICgha25pdHI6OmlzX2xhdGV4X291dHB1dCgpICYmIGtuaXRyOjppc19odG1sX291dHB1dCgpKSB7DQogIGNhdCgiWyFbUGFja2FnZV0oaHR0cHM6Ly93d3cucmVwb3N0YXR1cy5vcmcvYmFkZ2VzL2xhdGVzdC9hY3RpdmUuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3JlbXBzeWMvcmVtcHN5Yy9hY3Rpb25zKV0NCiAgICAgIFshW1RlbXBsYXRlIFdlYnNpdGVdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvdmlzaXQtd2Vic2l0ZS1FOTFFNjMpXShodHRwczovL3JlYWxpdHliZW5kaW5nLmdpdGh1Yi5pby9UZW1wbGF0ZVJlc3VsdHMvKQ0KICAgICAgWyFbV2Vic2l0ZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9kb3dubG9hZC0uZG9jeC1GRjU3MjIpXShodHRwczovL2dpdGh1Yi5jb20vUmVhbGl0eUJlbmRpbmcvVGVtcGxhdGVSZXN1bHRzL3Jhdy9tYWluL3dvcmRfYW5kX3BkZi9TdXBwbGVtZW50YXJ5TWF0ZXJpYWxzLmRvY3gpDQogICAgICBbIVtXZWJzaXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3NlZS0ucGRmLUZGOTgwMCldKGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFsaXR5QmVuZGluZy9UZW1wbGF0ZVJlc3VsdHMvYmxvYi9tYWluL3dvcmRfYW5kX3BkZi9TdXBwbGVtZW50YXJ5TWF0ZXJpYWxzLnBkZikiKQ0KfQ0KYGBgDQoNClRoaXMgcmVwb3J0IGRlc2NyaWJlcyB0aGUgcmVzdWx0cyBvZiB0aGUgZmlyc3QgcHJpbWluZyBtaW5kZnVsbmVzcyBzdHVkeSwgYXMgd2VsbCBhcyBvZiB0aGUgdHdvIG9ubGluZSBwaWxvdCBzdHVkaWVzIGZyb20gdGhlIFZhcmVsYSBwcm9qZWN0Lg0KDQojIFBhY2thZ2VzICYgRGF0YQ0KDQojIyBQYWNrYWdlcw0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQ0KbGlicmFyeShyZW1wc3ljKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoaW50ZXJhY3Rpb25zKQ0KbGlicmFyeShwZXJmb3JtYW5jZSkNCmxpYnJhcnkoc2VlKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJzdGF0aXgpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KHJlcG9ydCkNCnNvdXJjZSgiRDovVVFBTS9Hcm91cGUgw4l0dWRpYW50IEBQcm9qZXQgUmVtaSAtIERvY3VtZW50cy9FdHVkZSAxIC0tIHByaW1pbmctYWdyZXNzaW9uL0FuYWx5c2VzIC0gUHJpbWluZyAxL1NjcmlwdHMgUi9tYWQgZnVuY3Rpb25zLlIiKQ0KDQpzdW1tYXJ5KHJlcG9ydDo6cmVwb3J0KHNlc3Npb25JbmZvKCkpKQ0KYGBgDQoNCiMjIERhdGENCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1UUlVFLCByZXN1bHRzPSdhc2lzJ30NCmRmIDwtIHJlYWQuY3N2KCJkYXRhL2RhdGEuY3N2IikNCmRhdGEgPC0gcmVhZC5jc3YoImRhdGEvZnVsbGRhdGFzZXQuY3N2IikNCg0KY2F0KHBhc3RlKCJUaGUgZGF0YSBjb25zaXN0cyBvZiIsDQogICAgICAgICAgcmVwb3J0OjpyZXBvcnRfcGFydGljaXBhbnRzKGRhdGEpLA0KICAgICAgICAgICIuIFRoZXJlIGFyZSBubyBkZW1vZ3JhcGhpY3MgYXZhaWxhYmxlLiIpKQ0KDQojIER1bW15LWNvZGUgZ3JvdXAgdmFyaWFibGUNCmRhdGEgPC0gZGF0YSAlPiUgDQogIG11dGF0ZShjb25kaXRpb25fZHVtID0gaWZlbHNlKGNvbmRpdGlvbiA9PSAiTWluZGZ1bG5lc3MiLCAxLCAwKSwNCiAgICAgICAgIGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb24pKQ0KDQojIEFsbG9jYXRpb24gcmF0aW8NCmNhdChwYXN0ZSgiVGhlIGFsbG9jYXRpb24gcmF0aW8gaXM6ICIsDQogICAgICAgICAgcmVwb3J0OjpyZXBvcnQoZGF0YSRjb25kaXRpb24pKSkNCg0KYGBgDQoNCiMjIyBEYXRhIFByZXBhcmF0aW9uIHsudGFic2V0fQ0KDQpJbiB0aGlzIHN0YWdlLCB3ZSBkZWZpbmUgYSBsaXN0IG9mIG91ciByZWxldmFudCB2YXJpYWJsZXMgYW5kIHN0YW5kYXJkaXplIHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBNZWRpYW4gQWJzb2x1dGUgRGV2aWF0aW9uIChNQUQpLCB3aGljaCBpcyBtb3JlIHJvYnVzdCB0byBleHRyZW1lIG9ic2VydmF0aW9ucyB0aGFuIHN0YW5kYXJkaXphdGlvbiBhcm91bmQgdGhlIG1lYW4uDQoNCiMjIyMgQmFzaWMNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1UUlVFLCByZXN1bHRzPSdhc2lzJ30NCiMgTWFrZSBsaXN0IG9mIERWcw0KY29sLmxpc3QgPC0gYygiYmxhc3RpbnRlbnNpdHkiLCAiYmxhc3RkdXJhdGlvbiIsICJibGFzdGludGVuc2l0eS5kdXJhdGlvbiIsDQogICAgICAgICAgICAgICJibGFzdGludGVuc2l0eS5maXJzdCIsICJibGFzdGR1cmF0aW9uLmZpcnN0IiwgIktJTVMiLCANCiAgICAgICAgICAgICAgIkJTQ1MiLCAiQkFRIiwgIlNPUFQiLCAiSUFUIikNCg0KIyBDcmVhdGUgbmV3IHZhcmlhYmxlIGJsYXN0aW50ZW5zaXR5LmR1cmF0aW9uDQpkYXRhJGJsYXN0aW50ZW5zaXR5LmR1cmF0aW9uIDwtIChkYXRhJGJsYXN0aW50ZW5zaXR5ICogZGF0YSRibGFzdGR1cmF0aW9uKQ0KIyBEaXZpZGUgYnkgMj8gRG8gc29tZSBvdGhlciBzb3J0IG9mIHRyYW5zZm9ybWF0aW9uIGdpdmVuIEkgbXVsdGlwbGllZCB0d28gc2NvcmVzPw0KIyBTaG91bGQgSSBtdWx0aXBseSB0aGVtIGFmdGVyIHN0YW5kYXJkaXphdGlvbiBvciBiZWZvcmU/DQoNCiMgU3RhbmRhcmRpemUgYW5kIGNlbnRlciBtYWluIGNvbnRpbnVvdXMgSVYgdmFyaWFibGUgKGJhc2VkIG9uIE1BRCkNCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhhbGxfb2YoY29sLmxpc3QpLA0KICAgICAgICAgICAgICAgIH5zY2FsZV9tYWQoLngpLA0KICAgICAgICAgICAgICAgIC5uYW1lcyA9ICJ7Y29sfS5tYWQiKSkNCg0KIyBSZW5hbWUgY29sLmxpc3Qgd2l0aCB0aGUgTUFEIGV4dGVuc2lvbg0KY29sLmxpc3QgPC0gcGFzdGUwKGNvbC5saXN0LCAiLm1hZCIpDQoNCmBgYA0KDQojIyMjIEJsYXN0IEludGVuc2l0eSAqIER1cmF0aW9uDQoNCldoeSBjb21iaW5lIHRoZSBpbnRlbnNpdHkgYW5kIGR1cmF0aW9uIHNjb3Jlcz8gU2hvdWxkIHdlPyBGb3IgYSBkaXNjdXNzaW9uLCBzZWU6DQoNCkVsc29uLCBNLiwgTW9oc2VuaSwgTS4gUi4sIEJyZXVlciwgSi4sIFNjaGFya293LCBNLiwgJiBRdWFuZHQsIFQuICgyMDE0KS4gUHJlc3MgQ1JUVCB0byBtZWFzdXJlIGFnZ3Jlc3NpdmUgYmVoYXZpb3I6IHRoZSB1bnN0YW5kYXJkaXplZCB1c2Ugb2YgdGhlIGNvbXBldGl0aXZlIHJlYWN0aW9uIHRpbWUgdGFzayBpbiBhZ2dyZXNzaW9uIHJlc2VhcmNoLiAqUHN5Y2hvbG9naWNhbCBhc3Nlc3NtZW50KiwgKjI2KigyKSwgNDE5LiBodHRwczovL2RvaS5vcmcvMTAuMTAzNy9hMDAzNTU2OQ0KDQoqIEJ1c2htYW4gYW5kIEJhdW1laXN0ZXIgKDE5OTgpIHVzZWQgdGhlIHN1bSBvZiB2b2x1bWUgYW5kIGR1cmF0aW9uIHNldHRpbmdzIGluIHRoZSBmaXJzdCBvZiAyNSB0cmlhbHMgW3AuIDNdDQoqIExpbmRzYXkgYW5kIEFuZGVyc29uICgyMDAwKSBtdWx0aXBsaWVkIHZvbHVtZSB3aXRoIGxvZy10cmFuc2Zvcm1lZCBkdXJhdGlvbiBzZXR0aW5ncy4gVGhlIGF2ZXJhZ2Ugb3ZlciAyNSB0cmlhbHMgb2YgdGhvc2UgcHJvZHVjdHMgd2FzIHRoZWlyIG1lYXN1cmUgZm9yIG92ZXJhbGwgYWdncmVzc2lvbi4NCiogQ2FybmFnZXkgYW5kIEFuZGVyc29uICgyMDA1KSBhdmVyYWdlZCB0aGUgcHJvZHVjdHMgb2Ygdm9sdW1lIGFuZCB0aGUgc3F1YXJlIHJvb3Qgb2YgZHVyYXRpb24gdG8gZm9ybSBhIHNpbmdsZSDigJxhZ2dyZXNzaXZlIGVuZXJneSBzY29yZeKAnSAocC4gODg3KS4gTm8gcmVhc29uIGlzIGdpdmVuIGZvciB0aGlzIG90aGVyIHRoYW4gdGhlIGNsYWltIHRoYXQgdGhpcyBzaW5nbGUgc2NvcmUgc3VwcG9zZWRseSBpcyBhIHZhbGlkIG1lYXN1cmUgYW5kIHRoYXQgZHVyYXRpb24gc2hvdWxkIGJlIHNxdWFyZSByb290ZWQuDQoqIEJhcnRob2xvdywgU2VzdGlyLCBhbmQgRGF2aXMgKDIwMDUpIG11bHRpcGxpZWQgdGhlIGF2ZXJhZ2Ugdm9sdW1lIGFuZCBkdXJhdGlvbiBzZXR0aW5ncyB0byBmb3JtIGEgY29tcG9zaXRlIGFnZ3Jlc3NpdmUgYmVoYXZpb3Igc2NvcmUuIEFsdGhvdWdoIEJhcnRob2xvdywgQnVzaG1hbiwgYW5kIFNlc3RpciAoMjAwNikgYWxzbyB1c2VkIHZvbHVtZSBhbmQgZHVyYXRpb24gc2V0dGluZ3MsIHRoZXkgc3RhbmRhcmRpemVkIGFuZCBzdW1tZWQgdGhlIHR3byBwYXJhbWV0ZXJzIGluc3RlYWQgb2YgbXVsdGlwbHlpbmcgdGhlbS4NCiogU29tZXRpbWVzIHRoZSBvcHRpb24gb2Ygc2V0dGluZyB0aGUgdm9sdW1lIGFuZC9vciBkdXJhdGlvbiB0byB6ZXJvIGFzIGEgd2F5IHRvIGFjdCBub25hZ2dyZXNzaXZlbHkgaXMgcHJvdmlkZWQuICBJbmNsdWRpbmcgc2V0dGluZ3Mgb2YgemVybyBhcyBhbiBvcHRpb24gYWxzbyByYWlzZXMgZnVydGhlciBxdWVzdGlvbnMsIGZvciBleGFtcGxlLCBob3cgdG8gaGFuZGxlIHRyaWFscyBpbiB3aGljaCBwYXJ0aWNpcGFudHMgc2V0IG9ubHkgb25lIG9mIHRoZSB0d28gaW50ZW5zaXR5IHBhcmFtZXRlcnMgdG8gemVyby4gWyoqTm90ZTogd2UgZG8gaGF2ZSB6ZXJvIGFzIG9wdGlvbioqXQ0KKiBXaXRoIHJlZ2FyZCB0byB0aGUgYW5hbHlzaXMsIHRoZXJlIGlzIG5vIGRlZmluaXRpdmUgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbiBvZiBob3cgdG8gY2FsY3VsYXRlIGFnZ3Jlc3Npb24gc2NvcmVzLCBvciB3aGV0aGVyIGRpZmZlcmVudCBzY29yZXMgbWlnaHQgbWVhc3VyZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWdncmVzc2lvbiwgYXMgbG9uZyBhcyBub25lIG9mIHRoZW0gaGF2ZSBiZWVuIHByb3Blcmx5IHZhbGlkYXRlZC4gQXMgaXQgc2VlbXMgdGhhdCB2b2x1bWUgYW5kIGR1cmF0aW9uIGRvIG5vdCBtZWFzdXJlIHRoZSBleGFjdCBzYW1lIGNvbnN0cnVjdCwgaXQgaXMgYWR2aXNhYmxlIHRvIGNvbnNpZGVyIHRoZW0gYXMgc2VwYXJhdGUgbWVhc3VyZXMgZm9yIHJlbGF0ZWQgc3ViZGltZW5zaW9ucyBvZiBhZ2dyZXNzaW9uLg0KDQojIyMjIEZpcnN0IHNvdW5kIGJsYXN0DQoNCldoeSB1c2UgdGhlIGZpcnN0IHNvdW5kIGJsYXN0IG9ubHkgaW5zdGVhZCBvZiB0aGUgYXZlcmFnZSBvZiBhbGwgdHJpYWxzPyBTaG91bGQgd2U/DQoNCkFjY29yZGluZyB0byBzb21lLCB0aGUgVGF5bG9yIEFnZ3Jlc3Npb24gUGFyYWRpZ20gaXMgbm90IGEgbWVhc3VyZSBvZiBhZ2dyZXNzaW9uIHBlciBzYXksIGJ1dCBvZiByZWFjdGl2ZSBhZ2dyZXNzaW9uLCBiZWNhdXNlIHBhcnRpY2lwYW50cyByZWFjdCB0byB0aGUgb3RoZXIgInBhcnRpY2lwYW50J3MiIGFnZ3Jlc3Npb24uIFRoZXkgc3VnZ2VzdCB0aGF0IGZvciBhIHB1cmUgbWVhc3VyZSBvZiBhZ2dyZXNzaW9uLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugb25seSB0aGUgZmlyc3Qgc291bmQgYmxhc3QgdXNlZCBieSB0aGUgcGFydGljaXBhbnQgYmVmb3JlIGhlIHJlY2VpdmVzIG9uZSBoaW1zZWxmLiBBdCB0aGlzIHN0YWdlLCB3ZSBhdHRlbXB0IHRoZSBhbmFseXNlcyB3aXRoIGFsbCB0aGVzZSBkaWZmZXJlbnQgbWVhc3VyZXMgb2YgYWdncmVzc2lvbiBmb3IgZXhwbG9yYXRvcnkgcHVycG9zZXMuIFNlZSBlYXJsaWVyIHJlZmVyZW5jZSB0byBFbHNvbiBldCBhbC4gKDIwMTQpOg0KDQogICogSWYgcmVzZWFyY2hlcnMgYXJlIGludGVyZXN0ZWQgaW4gbWVhc3VyaW5nIHVucHJvdm9rZWQgYWdncmVzc2lvbiwgdGhleSBzaG91bGQgYWxzbyBsb29rIGF0IHRoZSBzZXR0aW5ncyBpbiB0aGUgZmlyc3QgdHJpYWwuIFRob3NlIHN0dWR5aW5nIHByb3Zva2VkIGFnZ3Jlc3Npb24gb3IgcmV0YWxpYXRpb24sIG9uIHRoZSBvdGhlciBoYW5kLCBzaG91bGQgZm9jdXMgb24gYWxsIHRyaWFscyBleGNlcHQgdGhlIGZpcnN0IG9uZS4NCg0KIyB0LXRlc3RzDQoNCmBgYHtyIGNoaWxkPWlmIChmYXN0ID09IEZBTFNFKSAnMV90X3Rlc3RzLlJtZCd9DQpgYGANCg0KIyBNb2RlcmF0aW9ucw0KDQpgYGB7ciBjaGlsZD1pZiAoZmFzdCA9PSBGQUxTRSkgJzJfbW9kZXJhdGlvbnMuUm1kJ30NCmBgYA0KDQojIENvbmNsdXNpb25zDQoNCkJhc2VkIG9uIHRoZSBhYnNlbmNlIG9mIGVmZmVjdCBmb3IgYmxhc3QgZHVyYXRpb24gb3IgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYmxhc3QgaW50ZW5zaXR5IGFuZCBibGFzdCBkdXJhdGlvbiwgSSB3b3VsZCBzdWdnZXN0IG1vZGlmeWluZyB0aGUgVGF5bG9yIHRhc2sgdG8gcmVtb3ZlIHRoZSBibGFzdCBkdXJhdGlvbiBwcm9tcHQgYXMgdG8gb25seSBrZWVwIGJsYXN0IGludGVuc2l0eS4gSXQgaXMgb25lIG9mIHRoZSBzcGVjaWZpYWJsZSBvcHRpb24gaW4gdGhlIHRhc2sgcGFyYW1ldGVycyBzbyBpdCBpcyBhbiBlYXN5IGNoYW5nZS4gSSBiZWxpZXZlIGRvaW5nIHNvIHdpbGwgcHJvdmlkZSBhIGNsZWFuZXIgYW5kIG1vcmUgc3RyYWlnaHRmb3J3YXJkIHRhc2sgZm9yIHBhcnRpY2lwYW50cy4NCg0KIyBGdWxsIENvZGUNCg0KVGhlIGZ1bGwgc2NyaXB0IG9mIGV4ZWN1dGl2ZSBjb2RlIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50IGlzIHJlcHJvZHVjZWQgaGVyZS4NCg0KYGBge3IgZnVsbF9jb2RlLCByZWYubGFiZWw9a25pdHI6OmFsbF9sYWJlbHMoKSwgZXZhbD1GQUxTRSwgY29kZV9mb2xkaW5nID0gImhpZGUifQ0KYGBgDQoNCiMgUGFja2FnZSBSZWZlcmVuY2VzDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KcmVwb3J0OjpjaXRlX3BhY2thZ2VzKHNlc3Npb25JbmZvKCkpDQpgYGANCg0KDQojIFJlZmVyZW5jZXMNCg==